#include <iostream>
using namespace std;

#include "tpilaporo.h"

/** \file tpilaporo.cpp
* \brief Procedimientos de la clase TPilaPoro.
*
* STANISLAV LITVINENKO DNI:02062226T
* JOSÉ FRANCÉS IRIONDO DNI:48469642V
*/

TPilaPoro::TPilaPoro()
{
	v.Redimensionar(10);
	posicion=0;
}

TPilaPoro::TPilaPoro(const TPilaPoro& p)
{
	v.~TVectorPoro();
	v.Redimensionar(p.Longitud());
	posicion=p.posicion;

	for(int i = 0; i <=p.Longitud();i++)
	{
		v[i]=p.v[i];
	}
}

TPilaPoro::~TPilaPoro()
{
        v.Redimensionar(10);    
        for (int i = 0; i < v.Longitud(); i++)
        {
                v[i].~TPoro();
        }
       
        posicion=0;
}

TPilaPoro&
TPilaPoro::operator=(const TPilaPoro &p)
{

        if (this != &p)
        {
                if (p.Longitud()>0 )
                {
                        v.Redimensionar(p.Longitud());
                        posicion=p.Longitud();

                        for (int i = 0; i <=p.Longitud(); i++)
                        {
                                v[i]=p.v[i];
                        }
                }
                else if(p.EsVacia())
                {
                        posicion=0;
                        v.Redimensionar(10);
                }
               
        }
        return *this;
}

bool
TPilaPoro::operator==(const TPilaPoro& p) const
{
        bool salir=false;
        bool dist=false;        

        for (int i = 0; i <=Longitud() && i<=p.Longitud() && !salir; i++)
        {
                if (v[i]==p.v[i])
                {
                        dist=false;
                }
                else
                {
                        salir=true;
                        dist=true;
                }
        }
       
        return !dist;
}

bool
TPilaPoro::EsVacia() const
{
	return (posicion == 0);
}

bool
TPilaPoro::Apilar(const TPoro& p)
{

        bool exito=false;

        if (posicion<=10)
        {
                v[posicion]=p;
                posicion++;
                exito=true;
        }
        else
        {
                TVectorPoro a((v.Longitud()+10));
                v.~TVectorPoro();
                a[posicion]=p;  
                v=a;
                posicion++;
                exito=true;    
        }

        return exito;
}

bool
TPilaPoro::Desapilar()
{
        bool exito=false;
        TVectorPoro aux(v.Longitud()-10);
       
        for (int i = 0; i < posicion; i++)
        {
                exito=v[i].EsVacio();
        }
       
        if(!exito && v.Cantidad()==10)
        {
                v.Redimensionar(v.Longitud()-10);
                posicion=posicion-10;
                v[posicion-1].~TPoro();
                exito=true;
        }
        else
        {
                v[posicion-1].~TPoro();
                posicion--;
                exito=true;
               
        }
       
        return exito;
}

TPoro
TPilaPoro::Cima() const
{
        return v[posicion-1];
}

int
TPilaPoro::Longitud() const
{
	return posicion;
}

TPilaPoro
TPilaPoro::operator+(const TPilaPoro &p) const
{
        int i = 0;
        TPilaPoro aux;
        TPoro b;
       
        if (p.v.Longitud()>v.Longitud())
        {
                for (; i < posicion; i++)
                {
                        b=v[i];
                        aux.Apilar(b);
                }
                for (; i <p.posicion ; i++)
                {
                        b=p.v[i];
                        aux.Apilar(b);
                }
        }
        else if(v.Longitud()>p.v.Longitud())
        {
                for (; i < p.posicion; i++)
                {
                        b=v[i];
                        aux.Apilar(b);
                }
                for (; i <posicion ; i++)
                {
                        b=p.v[i];
                        aux.Apilar(b);
                }
        }
        else
        {
		for(i=0; i < posicion; i++)
		{
			aux.Apilar(v[i]);
		}
		for(i=0; i< p.posicion; i++)
		{
			aux.Apilar(p.v[i]);		
		}
        }

        return aux;
}

ostream&
operator<<(ostream &os, const TPilaPoro &p)
{
	os << '{';

	int i=p.posicion-1;

	while(i>0)
	{
		os << p.v[i] << ' ';
		i--;
	}
	if(!p.EsVacia())
	{
		os << p.v[0];
	}
	
	os << '}';

	return os;
	
}
	
